from flask import Flask, Blueprint, render_template, request, redirect, url_for, flash, make_response, session, \
    current_app
import logging
from logging import FileHandler

from function.sqlite_function import *

app = Flask(__name__)

from view.analyse import _analyse
from view.log import _log
from view.make import _make
from view.select import _select
from view.login import _login
from view.export import _export

app.register_blueprint(_analyse)
app.register_blueprint(_log)
app.register_blueprint(_make)
app.register_blueprint(_select)
app.register_blueprint(_login)
app.register_blueprint(_export)

# 设置全局变量存储用户信息，避免总是从数据库查询
ctx = app.app_context()
ctx.push()  # 激活上下文
current_app.member = ''


# favicon.ico文件传送
@app.route('/favicon.ico')
def favicon():
    return app.send_static_file('/common/favicon.ico')


# 登录校验函数，这东西写在蓝图里就只对蓝图中的页面负责

# 进入登录页面，具有有效许可 -> 什么都不做 *
# 进入登录页面，具有过期的有效许可 -> 删除session并提示,跳转进登录页面 -
# 进入登录页面，没有许可 -> 什么都不做  *
# 进入其它任意界面，具有有效许可 -> 什么都不做  *
# 进入其它任意界面，没有许可 -> 跳转进登录页面
# 进入其它任意界面，具有过期的有效许可 -> 删除session并提示，跳转进登录页面 -

# 以上只能应付直接输入网址的情况，如果是登录后删除session，发送ajax请求的话该怎么办  比如有人手残点了清除cookie之类的选项
@app.before_request
def before_request():
    temp1 = [session.get('username'), session.get('password'), session.get('identity')]
    if temp1 in current_app.member:
        # app.logger.info(f"用户‘{session.get('username')}’登录")
        return None
    a = '/login'  # 登录页面
    b = '/static/common/jquery-3.6.0.min.js'  # 登录页面所需JS
    c = '/favicon.ico'  # 登录页面所需图标
    d = '/login1'  # 登录信息验证视图
    e = url_for('login.login_master')
    f = '/static/common/img/bg2.jpg'  # 登录页面的背景图片
    g = '/static/common/bootstrap/bootstrap.min.css'
    h = '/static/common/bootstrap/bootstrap.min.js'
    i = '/static/common/img/logo.png'  # 页面中的logo
    temp = [a, b, c, d, e, f, g, h, i]

    # if (request.path in temp) and (temp1 in current_app.member):
    #     return redirect(url_for('make.make_index'))
    if (session.get('username') is not None) and (temp1 not in current_app.member):
        session.clear()
        return render_template('login/refuse.html')
    elif request.path not in temp and session.get('username') is None:
        return redirect(url_for('login.login'))
    else:
        return None


# 在程序开始运行后直接提取全部登录信息到全局以便进行对比，减少服务器开销。
# 服务器信息更新后就更新全局变量。
@app.before_first_request
def first_request():
    con, cur = db_open()
    current_app.member = sqliteObject_to_list_h(cur, f'''
        select username, password, identity from master ORDER BY identity desc
    ''')


# session秘钥
app.secret_key = 'jskzfhhxyxphcmy'


# 指定照片存放地址,路径中不允许出现反斜杠。可以考虑添加一个自选照片存放位置的功能
current_app.photo = r'D:\uosWIN10\云服务器文件备份\warehouse\static\picture'
# 指定数据库地址
current_app.datapath = r'D:\uosWIN10\云服务器文件备份\warehouse\cmy.db'

if __name__ == '__main__':
    app.run()
    handler = logging.FileHandler('flask.log')
    app.logger.addHandler(handler)


#迁移至linux上时注意
# current_app.photo = '/中通公司/warehouse/static/picture'
# current_app.datapath = '/中通公司/warehouse/cmy.db'
# if __name__ == '__main__':
#     app.run(host='0.0.0.0',port=8002)